package com.yang.Offer;

public class Offer16 {
}

class Offer16Solution {
    // 快速幂的方法
    public double myPow(double x, int n) {
        double res = 1;
        long y = n;
        if (y < 0){
            y = -y;
            x = 1 / x;
        }
        // 整型=1再除以2 就会 按照double 转换为1.0/2=0.5 然后再转换为整型 变成0
        while(y > 0){
            // 这里相当于位运算  y代表了平方的次数 比如5 就是 1001 那么第一次取余得到1 表示需要乘一次x
            //  接下来 是 00 不需要乘 x  但是在这个过程中 x的值的一直变大的 从个位 x=x 依次位数向前 x^2 x^3
            // 到1001 的最左边的1 时  x = x^4  加上最有位的1  此时已经完成了5次方
            //  1   0   0   1
            // x^4 x^3 x^2  x^1
            if(y % 2 == 1){
                res = res * x;
            }
            x *= x;
            y /= 2;
        }
        return res;
    }
}
